

function curry(fn) {
    // 第一次执行时，定义一个数组专门用来存储所有的参数
    // 注意_args第一个参数是fn，要过滤掉
    let _args = [...arguments].slice(1)

    // 在内部声明一个函数，利用闭包的特性保存_args并收集所有的参数值
    const _curry = (...args)=> {
        _args.push(...args);
        return _curry;
    };

    // 利用toString隐式转换的特性，当最后执行时隐式转换，并计算最终的值返回
    _curry.value = function () {
        return fn(..._args)
    }
    return _curry;
}


//测试求和
let sum = (...arr) => {
    return arr.reduce((a, b) => {
        return a + b
    })
}
var sumPlus = curry(sum,2,2)
console.log(sumPlus(2)(2)(2)(2).value())


//测试console.log显示结果
let  show = (...arr) =>{
    console.log(...arr)
}
let showPlus = curry(show,1,2)('a')('b')('c')
showPlus('d').value()